package com.gitee.liuzhi.design.create;

import java.util.Objects;

/**
 * @Author liuzhi
 * @Date 2023/8/26 19:50
 * @Version 1.0
 * @Description 单例设计模式 Singleton Pattern
 * <p>
 * 单例设计模式涉及一个负责创建自己的对象的类, 同时确保对象只会创建一次, 这个类提供了一种访问其唯一的对象的方式, 可以直接访问, 不需要实例化该类的对象
 * <p>
 * 特点
 * 1. 单例类只能有一个实例 (构造函数是私有的, 外界不能创建对象)
 * 2. 单例类必须自己创建自己的唯一实例 (自己类的内部创建对象)
 * 3. 单例类并提供一个访问它的全局访问点 (暴露获取对象的方法)
 * <p>
 * 优点
 * 1. 在内存里只有一个实例, 减少了内存的开销, 尤其是频繁的创建和销毁实例
 * 2. 避免对资源的多重占用
 * <p>
 * 分类
 * 1. 懒汉式线程不安全单例模式
 * 2. 懒汉式线程安全单例模式 synchronized
 * 3. 饿汉式单例模式, 直接 new 实例
 */
public class SingletonPattern {

    public static volatile SingletonPattern INSTANCE;

    // 私有化构造方法
    private SingletonPattern() {

    }

    // 暴露获取对象的方法
    public static SingletonPattern getInstance() {
        if (Objects.isNull(INSTANCE)) {
            synchronized (SingletonPattern.class) {
                if (Objects.isNull(INSTANCE)) {
                    // 内部创建对象
                    INSTANCE = new SingletonPattern();
                }
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> System.out.println(SingletonPattern.getInstance())).start();
        }
    }

}
